<?php

/**
 * @author Grover Campos
 * @version 1.0
 * @created 03-ago-2009 06:43:06 p.m.
 */
class Gtux_Model_Formulario extends Gtux_Model_Estructura 
{
  /**
   * @var string
   */
  private $_etiqueta;
  /**
   * @var int
   */
  private $_id_formulario;
  /**
   * @var bool
   */
  private $_locked;
  /**
   * @var string
   */
  private $_nombre;
  /**
   * @var string
   */
  private $_nombre_tabla;
  /**
   * @var ArrayObject
   */
  private $_subformularios;
  /**
   * @var bool
   */
  private $_visible;
  /**
   * 
   * @var Zend_Db_Adapter_Mysqli
   */
  private $_dbConn;

  public function __construct(array $options = null, Zend_Db_Table_Row_Abstract $row = null) 
  {
    $this->_subformularios = new ArrayObject();
    parent::__construct($options, $row);
  }
  
  /**
   * Devuelve true si el formulario está bloqueado, retorna false en caso contrario
   *
   * @return bool
   */
  public function getLocked()
  {
    return $this->_locked;
  }

  /**
   * Devuelve la etiqueta
   *
   * @return string
   */
  public function getEtiqueta()
  {
    return $this->_etiqueta;
  }

  /**
   * Devuelve el id del formulario
   *
   * @return int
   */
  public function getIdFormulario()
  {
    return $this->_id_formulario;
  }

  /**
   * Devuelve el nombre del formulario
   *
   * @return string
   */
  public function getNombre()
  {
    return $this->_nombre;
  }

  /**
   * Devuelve el nombre de la tabla
   *
   * @return string
   */
  public function getNombreTabla() 
  {
  	return $this->_nombre_tabla;
  }
  
  /**
   * Devuelve un ArrayObject conteniendo los subformularios del formulario
   *
   * @return ArrayObject
   */
  public function getSubformularios()
  {
    return $this->_subformularios;
  }

  /**
   * Devuelve un iterador a los subformularios
   *
   * @return ArrayIterator
   */
  public function getSubformulariosIterator()
  {
    return $this->_subformularios->getIterator();
  }

  /**
   * Devuelve true si el formulario está visible, retorne false en caso contrario
   *
   * @return bool
   */
  public function getVisible()
  {
    return $this->_visible;
  }
  
  /**
   * Retorna la conexión a la base de datos del formulario
   * 
   * @return Zend_Db_Adapter_Abstract
   */
  public function getDbConn() 
  {
    return $this->_dbConn;
  }

  /**
   * Establece si el formulario está bloqueado
   * 
   * @param bool $locked
   * @return Gtux_Model_Formulario 
   */
  public function setLocked($locked)
  {
    $this->_locked = (bool)$locked;
    return $this;
  }
  
  /**
   * Establece la conexión a la base de datos del formulario
   * 
   * @param Zend_Db_Adapter_Abstract $dbConn
   * @return Gtux_Model_Formulario
   */
  public function setDbConn(Zend_Db_Adapter_Abstract $dbConn) 
  {
    $this->_dbConn = $dbConn;
    return $this;
  }

  /**
   * Establece la etiqueta
   * 
   * @param $etiqueta
   * @return Gtux_Model_Formulario 
   */
  public function setEtiqueta($etiqueta)
  {
    $this->_etiqueta = trim((string)$etiqueta);
    return $this;
  }

  /**
   * Establece el id del formulario
   * 
   * @param int $id_formulario
   * @return Gtux_Model_Formulario 
   */
  public function setIdFormulario($id_formulario)
  {
    if (Zend_Validate::is($id_formulario, 'Int'))
    {
      $this->_id_formulario = $id_formulario;
    }
    return $this;
  }

  /**
   * Establece el nombre del formulario
   * 
   * @param string $nombre
   * @return Gtux_Model_Formulario 
   */
  public function setNombre($nombre)
  {
    $this->_nombre = trim((string)$nombre);
    return $this;
  }
  
  /**
   * Devuelve el nombre de la tabla asociada
   *
   * @param string $nombre_tabla
   * @return Gtux_Model_Formulario 
   */
  public function setNombreTabla($nombre_tabla) 
  {
  	$this->_nombre_tabla = trim((string)$nombre_tabla);
    return $this;
  }
  
  /**
   * Establece los subformularios
   * 
   * @param ArrayObject $subformularios
   * @return Gtux_Model_Formulario 
   */
  public function setSubformularios(ArrayObject $subformularios)
  {
    $this->_subformularios = $subformularios;
    return $this;
  }
  
  /**
   * Establece un nuevo subformulario a la colección
   *
   * @param Gtux_Subformulario $subformulario
   * @return Gtux_Model_Formulario 
   */
  public function addSubformulario(Gtux_Model_Subformulario $subformulario) 
  {
  	$this->_subformularios->append($subformulario);
    return $this;
  }
  
  /**
   * Establece si el formulario es visible
   * 
   * @param bool $visible
   * @return Gtux_Model_Formulario 
   */
  public function setVisible($visible)
  {
    $this->_visible = (bool)$visible;
    return $this;
  }

  /**
   * @see Gtux_Model_Abstract::getGateway()
   *
   * @return Gtux_Model_Gateway_Abstract
   */
  public function getGateway()
  {
    if (null == $this->_gateway) 
    {
      $this->setGateway(new Gtux_Model_Gateway_Formulario());
    }
    return $this->_gateway;
  }
  
  /**
   * Inicialia un formulario a partir de la data de la estructura del 
   * formulario
   * 
   * @return Gtux_Model_Formulario
   */
  public static function iniciarDeDescribe($tabla, array $table_info, Gtux_Model_User $usuario) 
  {
    $formulario = new Gtux_Model_Formulario();
    $formulario->setEtiqueta($tabla)
               ->setLocked(false)
               ->setNombreTabla($tabla)
               ->setNombre($tabla)
               ->setUser($usuario)
               ->setVisible(true);
               
    $subformulario = new Gtux_Model_Subformulario();
    $subformulario->setFormulario($formulario)
                  ->setEtiqueta('')
                  ->setNombre('')
                  ->setUser($usuario);
    $formulario->addSubformulario($subformulario);

    foreach ($table_info as $campo_info) 
    {
      $campo = new Gtux_Model_Campo();
      $campo->setSubformulario($subformulario);
      $campo->setNombre($campo_info['COLUMN_NAME'])
            ->setEtiqueta($campo_info['COLUMN_NAME']);
      switch ($campo_info['DATA_TYPE']) 
      {
        case 'tinyint':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TINYINT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERSPINER);
          break;
        case 'smallint':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_SMALLINT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
          break;
        case 'mediumint':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_MEDIUMINT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
          break;
      	case 'int':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_INT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
      	  break;
      	case 'bigint':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_BIGINT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
      	  break;
      	case 'double':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_DOUBLE);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
      	  break;
      	case 'float':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_FLOAT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_NUMBERTEXTBOX);
      	  break;
      	case 'decimal':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_DECIMAL);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_CURRENCYTEXTBOX);
      	  break;
      	  
      	  
        case 'date':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_DATE);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_DATETEXTBOX);
          break;
        case 'time':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TIME);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TIMETEXTBOX);
          break;
        case 'datetime':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_DATETIME);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_DATETIME);
          break;
        case 'timestamp':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TIMESTAMP);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_DATETIME);
          break;
          
          
        case 'char':
          $campo->setTipoDato(Gtux_Model_Campo::CAMPO_CHAR);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTBOX);
          break;
      	case 'varchar':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_VARCHAR);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTBOX);
      	  break;
      	case 'tinytext':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TINYTEXT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTBOX);
      	  break;
      	case 'text':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TEXT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTAREA);
      	  break;
      	case 'mediumtext':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_MEDIUMTEXT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTAREA);
      	  break;
      	case 'longtext':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_LONGTEXT);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_TEXTAREA);
      	  break;
      	  
      	  
      	case 'tinyblob':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_TINYBLOB);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_FILE);
      	  break;
      	case 'blob':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_BLOB);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_FILE);
      	  break;
      	case 'mediumblob':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_MEDIUMBLOB);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_FILE);
      	  break;
      	case 'longblob':
      	  $campo->setTipoDato(Gtux_Model_Campo::CAMPO_LONGBLOB);
          $campo->setIdElemento(Gtux_Model_Elemento::ELEMENTO_FILE);
      	  break;
      }
      if (preg_match('/^enum.*/', $campo_info['DATA_TYPE'])) 
      {
      	$campo->setTipoDato(Gtux_Model_Campo::CAMPO_ENUM);
      }
      if (preg_match('/^set.*/', $campo_info['DATA_TYPE'])) 
      {
      	$campo->setTipoDato(Gtux_Model_Campo::CAMPO_SET);
      }
      $campo->setRequerido(!$campo_info['NULLABLE']);
      $campo->setVisible(true);
      $campo->setCampoTabla($campo_info['COLUMN_NAME']);
      $campo->setUser($usuario);
      // @todo tipo de validacion
      $subformulario->addCampo($campo);
    };
    return $formulario;
  }

  /**
   * Serialize
   * 
   * @return array
   */
  public function __sleep() 
  {
    return array(
      '_id_formulario', '_etiqueta', '_locked', '_nombre', '_nombre_tabla', '_subformularios', '_visible',
      '_created_at', '_user'
    );
  }
}
?>